<!doctype html>
<html lang="zh-cn">
<head>

    <meta charset="utf-8">
    <meta name="generator" content="Hugo 0.57.2" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>Go 编程规范 | The Sky of OtsWang</title>
    <meta property="og:title" content="Go 编程规范 - The Sky of OtsWang">
    <meta property="og:type" content="article">
        
    <meta property="article:published_time" content="2019-04-03T19:27:49&#43;08:00">
        
        
    <meta property="article:modified_time" content="2019-04-03T19:27:49&#43;08:00">
        
    <meta name="Keywords" content="golang,go语言,otswang,java,博客,python">
    <meta name="description" content="Go 编程规范">
        
    <meta name="author" content="OtsWang">
    <meta property="og:url" content="https://otswang.gitee.io/hugo/post/go/go_fmt/">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">

    <link rel="stylesheet" href="/hugo/css/normalize.css">
    
        <link rel="stylesheet" href="/hugo/css/prism.css">
    
    <link rel="stylesheet" href="/hugo/css/style.css">
    <script type="text/javascript" src="//cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>

    


    
    
</head>

<body>
<header id="header" class="clearfix">
    <div class="container">
        <div class="col-group">
            <div class="site-name ">
                
                    <a id="logo" href="https://otswang.gitee.io/hugo/">
                        The Sky of OtsWang
                    </a>
                
                <p class="description">擅长写HelloWorld的小小码农</p>
            </div>
            <div>
                <nav id="nav-menu" class="clearfix">
                    
                    
                    <a  href="https://otswang.gitee.io/hugo/" title="Home">Home</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/tags/" title="Tags">Tags</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/categories/" title="Categories">Categories</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/archives/" title="Archives">Archives</a>
                    
                    <a  href="https://otswang.gitee.io/hugo/about/" title="About">About</a>
                    
                </nav>
            </div>
        </div>
    </div>
</header>


<div id="body">
    <div class="container">
        <div class="col-group">

            <div class="col-8" id="main">
                <div class="res-cons">
                    <article class="post">
                        <header>
                            <h1 class="post-title">Go 编程规范</h1>
                        </header>
                        <date class="post-meta meta-date">
                            2019年4月3日
                        </date>
                        
                        <div class="post-meta">
                            <span>|</span>
                            
                                <span class="meta-category"><a href="https://otswang.gitee.io/hugo/categories/go">Go</a></span>
                            
                        </div>
                        
                        
                        
                        <div class="post-content">
                            <p>Go 编程规范 摘抄</p>

<h2 id="1-gofmt-命令">1. gofmt 命令</h2>

<p>大部分的格式问题可以通过 gofmt 来解决，gofmt 自动格式化代码，保证所有的 go 代码与官方推荐的格式保持一致，所有格式有关问题，都以gofmt的结果为准。所以，建议在提交代码库之前先运行一下这个命令。</p>

<h2 id="2-行长">2. 行长</h2>

<p>一行最长不超过80个字符，超过的使用换行展示，尽量保持格式优雅。</p>

<h2 id="3-注释">3. 注释</h2>

<p>在编码阶段应该同步写好 变量、函数、包 的注释，最后可以利用 godoc 命令导出文档。注释必须是完整的句子，句子的结尾应该用句号作为结尾（英文句号）。注释推荐用英文，可以在写代码过程中锻炼英文的阅读和书写能力。而且用英文不会出现各种编码的问题。
每个包都应该有一个包注释，一个位于 package 子句之前的块注释或行注释。包如果有多个 go 文件，只需要出现在一个 go 文件中即可。</p>

<pre><code class="language-go">	// ping包实现了常用的ping相关的函数
    package ping 
</code></pre>

<h2 id="4-命名">4. 命名</h2>

<p>需要注释来补充的命名就不算是好命名。</p>

<p>使用可搜索的名称：单字母名称和数字常量很难从一大堆文字中搜索出来。</p>

<p>单字母名称仅适用于短方法中的本地变量，名称长短应与其作用域相对应。</p>

<p>若变量或常量可能在代码中多处使用，则应赋其以便于搜索的名称。</p>

<p>做有意义的区分：Product 和 ProductInfo 和 ProductData 没有区别，NameString 和 Name 没有区别，要区分名称，就要以读者能鉴别不同之处的方式来区分 。</p>

<p>函数命名规则：驼峰式命名，名字可以长但是得把功能，必要的参数描述清楚，函数名应当是动词或动词短语，如 postPayment、deletePage、save。并依 Javabean 标准加上 get、set、is前缀。</p>

<p>例如：xxx + With + 需要的参数名 + And + 需要的参数名 + …..</p>

<p>结构体命名规则：结构体名应该是名词或名词短语，如 Custome、WikiPage、Account、AddressParser，避免使用Manager、Processor、Data、Info、这样的类名，类名不应当是动词。</p>

<p>包名命名规则：包名应该为小写单词，不要使用下划线或者混合大小写。</p>

<p>接口命名规则：单个函数的接口名以”er”作为后缀，如 Reader,Writer。接口的实现则去掉“er”。</p>

<pre><code class="language-go">type Reader interface {
    Read(p []byte) (n int, err error)
}

// 多个函数接口
type WriteFlusher interface {
    Write([]byte) (int, error)
    Flush() error
}
</code></pre>

<h2 id="5-常量">5. 常量</h2>

<p>常量均需使用全部大写字母组成，并使用下划线分词：</p>

<pre><code class="language-go">const APP_VER = &quot;1.0&quot;
// 如果是枚举类型的常量，需要先创建相应类型：

type Scheme string

const (
    HTTP  Scheme = &quot;http&quot;
    HTTPS Scheme = &quot;https&quot;
)
</code></pre>

<h2 id="6-变量">6. 变量</h2>

<p>变量命名基本上遵循相应的英文表达或简写，在相对简单的环境（对象数量少、针对性强）中，可以将一些名称由完整单词简写为单个字母，例如：</p>

<p>user 可以简写为 u</p>

<p>userID 可以简写 uid</p>

<p>// 若变量类型为 bool 类型，则名称应以 Has, Is, Can 或 Allow 开头：</p>

<pre><code class="language-go">var isExist bool
var hasConflict bool
var canManage bool
var allowGitHook bool
</code></pre>

<h2 id="7-变量命名惯例">7. 变量命名惯例</h2>

<p>变量名称一般遵循驼峰法，但遇到特有名词时，需要遵循以下规则：</p>

<p>如果变量为私有，且特有名词为首个单词，则使用小写，
如：apiClient。</p>

<p>其它情况都应当使用该名词原有的写法，
如 APIClient、repoID、UserID</p>

<p>错误示例：UrlArray，应该写成 urlArray 或者 URLArray</p>

<pre><code class="language-go">    //下面列举了一些常见的特有名词：
	&quot;API&quot;，&quot;ASCII&quot;，&quot;CPU&quot;，&quot;CSS&quot;，&quot;DNS&quot;，&quot;EOF&quot;，GUID&quot;，&quot;HTML&quot;，&quot;HTTP&quot;，
	&quot;HTTPS&quot;，&quot;ID&quot;,&quot;IP&quot;，&quot;JSON&quot;，&quot;LHS&quot;，&quot;QPS&quot;，&quot;RAM&quot;，&quot;RHS&quot;	&quot;RPC&quot;, &quot;SLA&quot;，
	&quot;SMTP&quot;，&quot;SSH&quot;，&quot;TLS&quot;，&quot;TTL&quot;,&quot;UI&quot;，&quot;UID&quot;，&quot;UUID&quot;，&quot;URI&quot;，&quot;URL&quot;， &quot;UTF8&quot;，
    &quot;VM&quot;，&quot;XML&quot;，&quot;XSRF&quot;，&quot;XSS&quot;
</code></pre>

<h2 id="8-struct规范">8. struct规范</h2>

<p>struct申明和初始化格式采用多行，定义如下：</p>

<pre><code class="language-go">type User struct{
	Username  string
	Email     string
}

// 初始化如下：

u := User{
    Username: &quot;test&quot;,
	Email:    &quot;test@gmail.com&quot;,
}
</code></pre>

<h2 id="9-panic">9. panic</h2>

<p>尽量不要使用panic，除非你知道你在做什么</p>

<h2 id="10-import">10. import</h2>

<p>对 import 的包进行分组管理，用换行符分割，而且标准库作为分组的第一组。</p>

<p>如果你的包引入了三种类型的包，标准库包，程序内部包，第三方包，建议采用如下方式进行组织你的包</p>

<pre><code class="language-go">package main

import (
    &quot;fmt&quot;
    &quot;os&quot;

    &quot;kmg/a&quot;
    &quot;kmg/b&quot;

    &quot;code.google.com/a&quot;
    &quot;github.com/b&quot;
)
</code></pre>

<pre><code>goimports 会自动帮你格式化
</code></pre>

<h2 id="11-参数传递">11. 参数传递</h2>

<p>对于少量数据，不要传递指针。对于大量数据的 struct 可以考虑使用指针。传入的参数是 map，slice，chan 不要传递指针，因为 map，slice，chan 是引用类型，不需要传递指针的指针</p>

<h2 id="12-单元测试">12. 单元测试</h2>

<p>单元测试文件名命名规范：</p>

<pre><code class="language-go">	 example_test.go
</code></pre>

<p>测试用例的函数名称必须以 Test 开头，例如：</p>

<pre><code class="language-go">	func TestExample
</code></pre>

<p>作者：滚雪球的哈士奇</p>

<p>链接：<a href="https://juejin.im/post/5ca3249f51882543bc78a2e5">https://juejin.im/post/5ca3249f51882543bc78a2e5</a></p>

<p>来源：掘金</p>

<p>著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</p>
                        </div>

                        


                        

<div class="post-archive">
    <h2>See Also</h2>
    <ul class="listing">
        
        <li><a href="/hugo/post/java/jvm/implementjvmwithgo/">《自己动手写Java虚拟机》读书笔记</a></li>
        
        <li><a href="/hugo/post/go/way_to_go/">WayToGo</a></li>
        
    </ul>
</div>


                        <div class="post-meta meta-tags">
                            
                            <ul class="clearfix">
                                
                                <li><a href="https://otswang.gitee.io/hugo/tags/go">Go</a></li>
                                
                            </ul>
                            
                        </div>
                    </article>
                    
    

    
    
                </div>
            </div>
            <div id="secondary">

    <section class="widget">
        <form id="search" action="//www.google.com/search" method="get" accept-charset="utf-8" target="_blank" _lpchecked="1">
      
      <input type="text" name="q" maxlength="20" placeholder="Search">
      <input type="hidden" name="sitesearch" value="https://otswang.gitee.io/hugo/">
      <button type="submit" class="submit icon-search"></button>
</form>
    </section>

    
    <div class="clear">
        <div class="toc-article">
            <div class="toc-title">文章目录</dixsv>
            <nav id="TableOfContents">
<ul>
<li>
<ul>
<li><a href="#1-gofmt-命令">1. gofmt 命令</a></li>
<li><a href="#2-行长">2. 行长</a></li>
<li><a href="#3-注释">3. 注释</a></li>
<li><a href="#4-命名">4. 命名</a></li>
<li><a href="#5-常量">5. 常量</a></li>
<li><a href="#6-变量">6. 变量</a></li>
<li><a href="#7-变量命名惯例">7. 变量命名惯例</a></li>
<li><a href="#8-struct规范">8. struct规范</a></li>
<li><a href="#9-panic">9. panic</a></li>
<li><a href="#10-import">10. import</a></li>
<li><a href="#11-参数传递">11. 参数传递</a></li>
<li><a href="#12-单元测试">12. 单元测试</a></li>
</ul></li>
</ul>
</nav>
        </div>
    </div>
    

</div>
        </div>
    </div>
</div>
<footer id="footer">
    <div class="container">
        &copy; 2020 <a href="https://otswang.gitee.io/hugo/">The Sky of OtsWang By OtsWang</a>.
        Powered by <a rel="nofollow noreferer noopener" href="https://gohugo.io" target="_blank">Hugo</a>.
        <a href="https://www.flysnow.org/" target="_blank">Theme</a> based on <a href="https://github.com/Dudiao137/maupassant-hugo" target="_blank">maupassant-ots</a>.
        
    </div>
</footer>


    <script type="text/javascript">
    
    (function(){
        $("pre code").parent().addClass("line-numbers")
    }())

    window.MathJax = {
        tex2jax: {
            inlineMath: [ ['$','$'] ],
            processEscapes: true
        }
    };
    </script>
    <script type="text/javascript" src="/hugo/js/prism.js" async="true"></script>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/MathJax.js?config=TeX-MML-AM_CHTML' async></script>

<a id="rocket" href="#top"></a>
<script type="text/javascript" src="/hugo/js/totop.js?v=0.0.0" async=""></script>







 
 <script src="https://mermaidjs.github.io/scripts/mermaid.min.js"></script>
 <script>
       mermaid.initialize({ startOnLoad: true });
 </script>
</body>
</html>
